package com.sojson.util.page;

import com.github.pagehelper.PageHelper;
import com.sojson.base.impl.BaseDto;
import com.sojson.util.MatcheUtil;
import com.sojson.util.StringUtil;
import com.sojson.util.page.bo.PageDomain;

/**
 * 分页工具类
 * 
 * @author liu
 * @date 2021-07-23
 */
public class PageUtil {

    /** 第几页默认值 */
    public static final int PAGE_NUM_DEFAULT = 1;
    /** 所有页 */
    public static final int PAGE_NUM_ALL = -1;
    /** 每页显示记录数默认值 */
    public static final int PAGE_SIZE_DEFAULT = 10;
    /** 所有记录 */
    public static final int PAGE_SIZE_ALL = -1;
    /** 第几页 */
    public static final String PAGE_NUM = "pageNum";
    /** 每页显示记录数 */
    public static final String PAGE_SIZE = "pageSize";
    /** 排序列 */
    public static final String ORDER_BY_COLUMN = "orderByColumn";
    /** 排序字段(空) */
    private static final String DEFAULT_SORT_EMPTY = "";
    /** 排序字段(ID降序) */
    private static final String DEFAULT_SORT_ID_DESC = "id desc";
    /** 默认排序字段 */
    private static final String DEFAULT_SORT = DEFAULT_SORT_ID_DESC;

    /**
     * 获取排序字段
     * 
     * @param orderByColumn
     * @return
     */
    public static String getOrderBy(String orderByColumn) {
        return getOrderBy(orderByColumn, DEFAULT_SORT_EMPTY);
    }

    /**
     * 获取排序字段
     * 
     * @param orderByColumn
     * @param defaultSort   默认排序字段
     * @return
     */
    public static String getOrderBy(String orderByColumn, String defaultSort) {
        if (StringUtil.isEmpty(orderByColumn)) {
            return defaultSort;
        }

        return MatcheUtil.escapeOrderBySql(orderByColumn);
    }

    /** 设置请求分页数据(默认有分页)  */
    public static void startPage(BaseDto dto) {
        startPage(dto.getPageNum(), dto.getPageSize(), dto.getOrderByColumn());
    }

    /** 设置请求分页数据(默认查所有) */
    public static void startPageAll(BaseDto dto) {
        startPageAll(dto.getPageNum(), dto.getPageSize(), dto.getOrderByColumn());
    }

    /** 设置请求分页数据(默认有分页,默认按ID降序排序)  */
    public static void startPageDefaultSort(BaseDto dto) {
        startPageDefaultSort(dto.getPageNum(), dto.getPageSize(), dto.getOrderByColumn());
    }

    /** 设置请求分页数据(默认查所有,默认按ID降序排序) */
    public static void startPageAllDefaultSort(BaseDto dto) {
        startPageAllDefaultSort(dto.getPageNum(), dto.getPageSize(), dto.getOrderByColumn());
    }

    /** 设置请求分页数据(默认有分页)  */
    public static void startPage() {
        startPage(TableSupport.buildPageRequest());
    }

    /** 设置请求分页数据(默认查所有) */
    public static void startPageAll() {
        startPageAll(TableSupport.buildPageRequest());
    }

    /** 设置请求分页数据(默认有分页,默认按ID降序排序)  */
    public static void startPageDefaultSort() {
        startPageDefaultSort(TableSupport.buildPageRequest());
    }

    /** 设置请求分页数据(默认查所有,默认按ID降序排序) */
    public static void startPageAllDefaultSort() {
        startPageAllDefaultSort(TableSupport.buildPageRequest());
    }

    /** 设置请求分页数据(默认有分页)  */
    public static void startPage(PageDomain dto) {
        startPage(dto.getPageNum(), dto.getPageSize(), dto.getOrderByColumn());
    }

    /** 设置请求分页数据(默认查所有) */
    public static void startPageAll(PageDomain dto) {
        startPageAll(dto.getPageNum(), dto.getPageSize(), dto.getOrderByColumn());
    }

    /** 设置请求分页数据(默认有分页,默认按ID降序排序)  */
    public static void startPageDefaultSort(PageDomain dto) {
        startPageDefaultSort(dto.getPageNum(), dto.getPageSize(), dto.getOrderByColumn());
    }

    /** 设置请求分页数据(默认查所有,默认按ID降序排序) */
    public static void startPageAllDefaultSort(PageDomain dto) {
        startPageAllDefaultSort(dto.getPageNum(), dto.getPageSize(), dto.getOrderByColumn());
    }

    /** 设置请求分页数据(默认有分页)  */
    public static void startPage(Integer pageNum, Integer pageSize, String orderByColumn) {
        startPage(pageNum, pageSize, orderByColumn, DEFAULT_SORT_EMPTY);
    }

    /** 设置请求分页数据(默认查所有) */
    public static void startPageAll(Integer pageNum, Integer pageSize, String orderByColumn) {
        startPageAll(pageNum, pageSize, orderByColumn, DEFAULT_SORT_EMPTY);
    }

    /** 设置请求分页数据(默认有分页,默认按ID降序排序)  */
    public static void startPageDefaultSort(Integer pageNum, Integer pageSize, String orderByColumn) {
        startPage(pageNum, pageSize, orderByColumn, DEFAULT_SORT);
    }

    /** 设置请求分页数据(默认查所有,默认按ID降序排序) */
    public static void startPageAllDefaultSort(Integer pageNum, Integer pageSize, String orderByColumn) {
        startPageAll(pageNum, pageSize, orderByColumn, DEFAULT_SORT);
    }

    /** 设置请求分页数据(默认有分页)  */
    public static void startPage(Integer pageNum, Integer pageSize, String orderByColumn, String defaultSort) {
        if (pageNum == null) {
            pageNum = PAGE_NUM_DEFAULT;
        } else if (pageNum == PAGE_NUM_ALL) {
            pageNum = null;
        }
        if (pageSize == null) {
            pageSize = PAGE_SIZE_DEFAULT;
        } else if (pageSize == PAGE_SIZE_ALL) {
            pageSize = null;
        }
        startPageAll(pageNum, pageSize, orderByColumn, defaultSort);
    }

    /** 设置请求分页数据(默认查所有) */
    public static void startPageAll(Integer pageNum, Integer pageSize, String orderByColumn, String defaultSort) {
        if (StringUtil.isNotBlankObject(pageNum) && StringUtil.isNotBlankObject(pageSize)) {
            PageHelper.startPage(pageNum, pageSize);
        }
        PageHelper.orderBy(getOrderBy(orderByColumn, defaultSort));
    }

    /** 查询所有数据 */
    public static void all(BaseDto dto) {
        dto.setPageNum(PAGE_NUM_ALL);
        dto.setPageSize(PAGE_SIZE_ALL);
    }

}